﻿using System.Linq;
using Controller2.Models;

namespace Controller2.BLL
{
    public class PessoaBll
    {
        public static Pessoa GetPessoa(ControllerBDModelContainer db, int id)
        {
            var pessoa = (from p in db.Pessoa
                          where p.IdPessoa == id
                          select p).FirstOrDefault();

            return pessoa;
        }

        public static Pessoa GetPessoa(ControllerBDModelContainer db, string userName)
        {
            var pessoa = (from p in db.Pessoa
                          where p.UserName == userName
                          select p).FirstOrDefault();

            return pessoa;
        }

        public static string GetTipoPessoa(ControllerBDModelContainer db, int id)
        {
            var tp = (from p in db.Pessoa
                      where p.IdPessoa == id
                      from t in p.TipoPessoa
                      select t.Tipo).FirstOrDefault();

            return tp;
        }

        public static string GetTipoPessoa(ControllerBDModelContainer db, Pessoa p)
        {
            var tp = (from t in p.TipoPessoa
                      select t.Tipo).FirstOrDefault();

            return tp;
        }

        public static Pessoa GetPessoaCliente(ControllerBDModelContainer db, int id)
        {
            var cli = (from t in db.TipoPessoa
                       where t.Tipo.Equals("Cliente")
                       from p in t.Pessoa
                       where p.IdPessoa == id
                       select p).FirstOrDefault();

            return cli;
        }

        public static string GetPessoaTipoCliente(ControllerBDModelContainer db, int id)
        {
            if (db.Pessoa.OfType<Pessoa_PF>().FirstOrDefault(p => p.IdPessoa == id) != null)
            {
                return "pf";
            }
            else
            {
                return "pj";
            }
        }

        public static Pessoa_PF GetPessoaFisicaCliente(ControllerBDModelContainer db, int id)
        {
            var cli = (from t in db.TipoPessoa
                       where t.Tipo.Equals("Cliente")
                       from p in t.Pessoa.OfType<Pessoa_PF>()
                       where p.IdPessoa == id
                       select p).FirstOrDefault();

            return cli;
        }

        public static Pessoa_PJ GetPessoaJuridicaCliente(ControllerBDModelContainer db, int id)
        {
            var cli = (from t in db.TipoPessoa
                       where t.Tipo.Equals("Cliente")
                       from p in t.Pessoa.OfType<Pessoa_PJ>()
                       where p.IdPessoa == id
                       select p).FirstOrDefault();

            return cli;
        }

        public static bool ValidarCNPJ(string cnpj)
        {
            if (string.IsNullOrWhiteSpace(cnpj.Trim()))
            {
                return true;
            }
            else
            {
                int[] multiplicador1 = new int[12] { 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
                int[] multiplicador2 = new int[13] { 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
                int soma;
                int resto;
                string digito;
                string tempCnpj;

                cnpj = cnpj.Trim();
                cnpj = cnpj.Replace(".", "").Replace("-", "").Replace("/", "");

                if (cnpj.Length != 14)
                    return false;

                tempCnpj = cnpj.Substring(0, 12);

                soma = 0;
                for (int i = 0; i < 12; i++)
                    soma += int.Parse(tempCnpj[i].ToString()) * multiplicador1[i];
                
                resto = (soma % 11);
                if (resto < 2)
                    resto = 0;
                else
                    resto = 11 - resto;

                digito = resto.ToString();

                tempCnpj = tempCnpj + digito;
                soma = 0;
                for (int i = 0; i < 13; i++)
                    soma += int.Parse(tempCnpj[i].ToString()) * multiplicador2[i];
                
                resto = (soma % 11);
                if (resto < 2)
                    resto = 0;
                else
                    resto = 11 - resto;

                digito = digito + resto.ToString();

                var retorno = cnpj.EndsWith(digito);

                return retorno;
            }
        }

        public static bool ValidarCPF(string cpf)
        {
            if (string.IsNullOrWhiteSpace(cpf.Trim()))
            {
                return true;
            }
            else
            {
                int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
                int[] multiplicador2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
                string tempCpf;
                string digito;
                int soma;
                int resto;

                cpf = cpf.Trim();
                cpf = cpf.Replace(".", "").Replace("-", "");

                if (cpf.Length != 11)
                    return false;

                switch (cpf)
                {
                    case "11111111111":
                        return false;
                    case "00000000000":
                        return false;
                    case "22222222222":
                        return false;
                    case "33333333333":
                        return false;
                    case "44444444444":
                        return false;
                    case "55555555555":
                        return false;
                    case "66666666666":
                        return false;
                    case "77777777777":
                        return false;
                    case "88888888888":
                        return false;
                    case "99999999999":
                        return false;
                }

                tempCpf = cpf.Substring(0, 9);
                soma = 0;
                for (int i = 0; i < 9; i++)
                    soma += int.Parse(tempCpf[i].ToString()) * multiplicador1[i];

                resto = soma % 11;
                if (resto < 2)
                    resto = 0;
                else
                    resto = 11 - resto;

                digito = resto.ToString();

                tempCpf = tempCpf + digito;

                soma = 0;
                for (int i = 0; i < 10; i++)
                    soma += int.Parse(tempCpf[i].ToString()) * multiplicador2[i];

                resto = soma % 11;
                if (resto < 2)
                    resto = 0;
                else
                    resto = 11 - resto;

                digito = digito + resto.ToString();

                return cpf.EndsWith(digito);
            }
        }

        public static bool ExisteCPF(ControllerBDModelContainer db, string cpf)
        {
            return db.Pessoa.OfType<Pessoa_PF>().Where(w => w.CPF == cpf).FirstOrDefault() != null || db.Pessoa.OfType<Pessoa_Func>().Where(w => w.CPF == cpf).FirstOrDefault() != null;            
        }

        public static bool ExisteCNPJ(ControllerBDModelContainer db, string cnpj)
        {
            return db.Pessoa.OfType<Pessoa_PJ>().Where(w => w.CNPJ == cnpj).FirstOrDefault() != null;
        }
    }
}